package cn.fansunion.leecode.string;

/**
 * 字符串相加.
 * 给定两个字符串形式的非负整数 num1 和num2 ，计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库（比如 BigInteger）， 也不能直接将输入的字符串转换为整数形式。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/add-strings
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @author wen.lei@brgroup.com
 *
 * 2022-1-13
 */
public class AddStrings {
    
    //12345->54321
    //6789-> 9876
    public String addStrings(String num1, String num2) {
        //特殊情况
        if(num1==null || num1.length()==0) {
            return num2;
        }
        if(num2==null || num2.length()==0) {
            return num1;
        }
        int num1Length=num1.length();
        int num2Length = num2.length();
        //最大长度
        int maxLength = num1Length>num2Length?num1Length:num2Length;
        //逆序
        String num3 = reverse(num1);
        String num4 = reverse(num2);
        //下一个是否有进位的1
        int nextLocationNum=0;
        StringBuilder sb = new StringBuilder();
        for(int index=0;index<maxLength;index++) {
            int oneNum=0;
            if(index <num3.length()) {
                char one=num3.charAt(index);
                oneNum=Character.getNumericValue(one);
            }
            int twoNum=0;
            if(index <num4.length()) {
                char two=num4.charAt(index);
                twoNum=Character.getNumericValue(two);
            }
            //相加求和
            int currentNumSum=oneNum+twoNum+nextLocationNum;
            //取模
            int currentNum=currentNumSum%10;
            if(currentNumSum>=10) {
                nextLocationNum=1;
            }else {
                nextLocationNum=0;
            }
            sb.append(currentNum);
        }
        //最后1个进位
        if(nextLocationNum==1) {
            sb.append(nextLocationNum);
        }
        String sum= sb.toString();
        //逆序返回
        return reverse(sum);
    }
    
    /**
     * 对一个字符串逆序
     * @param num
     * @return
     */
    private String reverse(String num) {
        StringBuilder sb = new StringBuilder();
        for(int index=num.length()-1;index>=0;index--) {
            sb.append(num.charAt(index));
        }
        return sb.toString();
    }
    
    public String addStringsByInt(String num1, String num2) {
        int num1Int=Integer.parseInt(num1);
        int num2Int=Integer.parseInt(num2);
        return (num1Int+num2Int)+"";
    }
}
